home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / apl / gview120.lzh / gviewsrc.lzh / pic_load.c < prev    next >
C/C++ Source or Header  |  1995-02-13  |  3KB  |  132 lines

  1. /*    Copyright 1992 H.Ogasawara (COR.)    */
  2.  
  3. #include    <corlib.h>
  4. #include    <sys_doslib.h>
  5. #include    "gview.h"
  6.  
  7. #define        WSIZE    (1024*32)
  8.  
  9. static int        sizex, sizey;
  10. static unsigned char    com[256];
  11. void            *PicBUFADR;
  12.  
  13. static void
  14. ToSmall( gp )
  15. GVIEW    *gp;
  16. {
  17.     unsigned short    *str= gp->buf, *ptr= gp->buf;
  18.     int    y= 255;
  19.     for(; y >= 0 ; y-= 3 ){
  20.         int    x;
  21.         for( x= 256 ; x-- >= 0 ;){
  22.             unsigned int    a= *ptr++,
  23.                     b= *ptr++,
  24.                     c= ptr[512-2],
  25.                     d= ptr[512-1];
  26.             *str++=
  27.     ((((a&0xf800)+(b&0xf800)+(c&0xf800)+(d&0xf800))>>2)&0xf800)+
  28.     ((((a&0x07c0)+(b&0x07c0)+(c&0x07c0)+(d&0x07c0))>>2)&0x07c0)+
  29.     ((((a&0x003e)+(b&0x003e)+(c&0x003e)+(d&0x003e))>>2)&0x003e);
  30.         }
  31.         ptr+= 512;
  32.         for( x= 256 ; x-- >= 0 ;){
  33.             unsigned int    a= *ptr++,
  34.                     b= *ptr++,
  35.                     c= ptr[512-2],
  36.                     d= ptr[512-1],
  37.                     e= ptr[1024-2],
  38.                     f= ptr[1024-1],
  39.                     g= ptr[1536-2],
  40.                     h= ptr[1536-1];
  41.             *str++=
  42.         ((((a&0xf800)+(b&0xf800)+(c&0xf800)+(d&0xf800)+
  43.            (e&0xf800)+(f&0xf800)+(g&0xf800)+(h&0xf800))>>3)&0xf800)+
  44.         ((((a&0x07c0)+(b&0x07c0)+(c&0x07c0)+(d&0x07c0)+
  45.            (e&0x07c0)+(f&0x07c0)+(g&0x07c0)+(h&0x07c0))>>3)&0x07c0)+
  46.         ((((a&0x003e)+(b&0x003e)+(c&0x003e)+(d&0x003e)+
  47.            (e&0x003e)+(f&0x003e)+(g&0x003e)+(h&0x003e))>>3)&0x003e);
  48.         }
  49.         ptr+= 1536;
  50.     }
  51.     SETBLOCK( gp, ((char*)gp->buf) - (char*)gp + 256*170*2 );
  52.     gp->h= 256;
  53.     gp->v= 170;
  54. }
  55.  
  56. static void
  57. PicResize( gp )
  58. GVIEW    *gp;
  59. {
  60.     if( sizex != 512 ){
  61.         unsigned short    *str= gp->buf, *ptr= gp->buf;
  62.         int    y;
  63.         for( y= 0 ; y< sizey ; y++, ptr+= (512-sizex) ){
  64.             int    x;
  65.             for( x= 0 ; x< sizex ; x++ )
  66.                 *str++= *ptr++;
  67.         }
  68.     }
  69.     SETBLOCK( gp, ((char*)gp->buf) - (char*)gp + sizey*sizex*2 );
  70.     gp->h= sizex;
  71.     gp->v= sizey;
  72. }
  73.  
  74. static
  75. size_check( fn )
  76. {
  77.     unsigned char    *p;
  78.     READ( fn, p= com, 256 );
  79.     if( *p != 'P' || p[1] != 'I' || p[2] != 'C' ){
  80.         CLOSE( fn );
  81.         GV_Err( "PICフォーマットが違います" );
  82.         return    FALSE;
  83.     }
  84.     for( com[255]= 0x1a ; *p != 0x1a ; p++ );
  85.     *p++= '\0';
  86.     for( com[255]= 0    ; *p != 0x00 ; p++ );
  87.     p++;        /* skip NUL */
  88.     SEEK( fn, p-com, 0 );
  89.     p+= 2;    /* 0  */
  90.     p+= 2;    /* 15 */
  91.  
  92.     sizex= (*p<<8)+p[1];    p+= 2;
  93.     sizey= (*p<<8)+p[1];    p+= 2;
  94.     if( sizex > 512 || sizey > 512 ){
  95.         GV_Err( "巨大なデータは展開できません" );
  96.         return    FALSE;
  97.     }
  98.     return    TRUE;
  99. }
  100.  
  101. GVIEW *
  102. GV_Load_Pic( fname )
  103. char    *fname;
  104. {
  105.     int    fn;
  106.     if( (fn= OPEN( fname, 0 ))>= 0 && size_check( fn ) ){
  107.         char    wbuf[WSIZE];
  108.         GVIEW    *gp;
  109.         if( !(gp= GV_Alloc( 512, 512, WindowAttrGraphic65536,
  110.                             fname, com+3, 0 )) ){
  111.             CLOSE( fn );
  112.             GV_Err( "メモリが足りません" );
  113.             return    NULL;
  114.         }
  115.         PicBUFADR= gp->buf;
  116.         if( PicLoad( fn, 0, 0, wbuf, WSIZE ) < 0 ){
  117.             CLOSE( fn );
  118.             MFREE( gp );
  119.             GV_Err( "PIC展開エラー" );
  120.             return    NULL;
  121.         }
  122.         CLOSE( fn );
  123.         if( sizex != 512 || sizey != 512 )
  124.             PicResize( gp );
  125.         else
  126.             ToSmall( gp );
  127.         return    gp;
  128.     }
  129.     GV_Err( "PICオープンできません" );
  130.     return    NULL;
  131. }
  132.